/*******************************************************************

    Author: Xiao
    Date: 2022/3/30 9:11

*******************************************************************/
package controller

import (
	"github.com/gin-gonic/gin"
	"mcr/pkg/config"
	"mcr/pkg/dao"
	"mcr/pkg/logs"
	"mcr/pkg/middleware"
	"mcr/pkg/utils"
)

// 上传图片
func UploadImage(ctx *gin.Context) {
	token := ctx.PostForm("access_token")
	if token == config.ConfigValue.GuestToken {
		ctx.JSON(200, gin.H{
			"code": 401,
			"msg":  "请登录后体验完整功能!",
		})
		return
	}
	img, _, err := ctx.Request.FormFile("file")
	if err != nil {
		logs.Log.Errorf("获取文件失败:%s", err)
		ctx.JSON(200, gin.H{
			"code": 500,
			"msg":  "上传文件失败，请检查你的文件！",
		})
		return
	}

	fm, err := utils.SaveImage(false, img)
	if err != nil {
		ctx.JSON(200, gin.H{
			"code": 500,
			"msg":  "上传文件失败，请检查你的文件！",
		})
		return
	}
	var a dao.Attach
	a.AttachPath = fm.FilePath
	a.AttachSha = fm.FileSha
	a.AttachSize = fm.FileSize
	a.AttachType = fm.FileType
	a.AttachThumb = fm.FileThumb
	a.AttachUser, err = middleware.GetUserId(token)
	if err != nil {
		logs.Log.Errorf("上传文件时从token(%s)中获取用户失败:%s", token, err)
	}
	a, err = dao.SaveAttach(a)
	if err != nil {
		logs.Log.Errorf("保存文件信息失败:%s", err)
		ctx.JSON(200, gin.H{
			"code": 500,
			"msg":  "上传文件失败,请重试！",
		})
		return
	}

	ctx.JSON(200, gin.H{
		"code": 200,
		"msg":  "上传成功！",
		"data": a,
	})
	return
}

// 上传头像
func UploadHead(ctx *gin.Context) {
	token := ctx.PostForm("access_token")
	if token == config.ConfigValue.GuestToken {
		ctx.JSON(200, gin.H{
			"code": 401,
			"msg":  "请登录后体验完整功能!",
		})
		return
	}
	img, _, err := ctx.Request.FormFile("file")
	if err != nil {
		logs.Log.Errorf("获取文件失败:%s", err)
		ctx.JSON(200, gin.H{
			"code": 500,
			"msg":  "上传文件失败，请检查你的文件！",
		})
		return
	}
	fm, err := utils.SaveImage(false, img)
	if err != nil {
		ctx.JSON(200, gin.H{
			"code": 500,
			"msg":  "上传文件失败，请检查你的文件！",
		})
		return
	}
	_, err = img.Seek(0, 0)
	if err != nil {
		logs.Log.Errorf("指针重置失败:%s", err)
		ctx.JSON(200, gin.H{
			"code": 500,
			"msg":  "上传文件失败，请检查你的文件！",
		})
		return
	}
	fm, err = utils.SaveImage(true, img)
	if err != nil {
		ctx.JSON(200, gin.H{
			"code": 500,
			"msg":  "上传文件失败，请检查你的文件！",
		})
		return
	}
	var a dao.Attach
	a.AttachPath = fm.FilePath
	a.AttachSha = fm.FileSha
	a.AttachSize = fm.FileSize
	a.AttachType = fm.FileType
	a.AttachThumb = fm.FileThumb
	a.AttachUser, err = middleware.GetUserId(token)
	if err != nil {
		logs.Log.Errorf("上传文件时从token(%s)中获取用户失败:%s", token, err)
	}

	a, err = dao.SaveAttach(a)
	if err != nil {
		logs.Log.Errorf("保存文件信息失败:%s", err)
		ctx.JSON(200, gin.H{
			"code": 500,
			"msg":  "上传文件失败,请重试！",
		})
		return
	}

	ctx.JSON(200, gin.H{
		"code": 200,
		"msg":  "上传成功！",
		"data": a,
	})
	return
}

// 上传音乐
func UploadMusic(ctx *gin.Context) {
	token := ctx.PostForm("access_token")
	if token == config.ConfigValue.GuestToken {
		ctx.JSON(200, gin.H{
			"code": 401,
			"msg":  "请登录后体验完整功能!",
		})
		return
	}
	music, header, err := ctx.Request.FormFile("file")
	if err != nil {
		logs.Log.Errorf("获取文件失败:%s", err)
		ctx.JSON(200, gin.H{
			"code": 500,
			"msg":  "上传文件失败，请检查你的文件！",
		})
		return
	}
	if header.Size > 8388608 {
		ctx.JSON(200, gin.H{
			"code": 500,
			"msg":  "上传文件太大了！",
		})
		return
	}
	fm, err := utils.SaveMusic(music)
	if err != nil {
		ctx.JSON(200, gin.H{
			"code": 500,
			"msg":  "上传文件失败，请检查你的文件！",
		})
		return
	}
	var a dao.Attach
	a.AttachPath = fm.FilePath
	a.AttachSha = fm.FileSha
	a.AttachSize = fm.FileSize
	a.AttachType = fm.FileType
	a.AttachThumb = fm.FileThumb
	a.AttachUser, err = middleware.GetUserId(token)
	if err != nil {
		logs.Log.Errorf("上传文件时从token(%s)中获取用户失败:%s", token, err)
	}
	a, err = dao.SaveAttach(a)
	if err != nil {
		logs.Log.Errorf("保存文件信息失败:%s", err)
		ctx.JSON(200, gin.H{
			"code": 500,
			"msg":  "上传文件失败,请重试！",
		})
		return
	}

	ctx.JSON(200, gin.H{
		"code": 200,
		"msg":  "上传成功！",
		"data": a,
	})
	return
}
